import java.util.ArrayList;

public class Estatistica07 extends Estatisticas
{
	public int deltaTAtual = 1;
	public int tempoEstavel = 0;
	public double tamDelta = 2000;
	double somatorioDelta = 0;
	double mediaTotal;
	double mediaDelta;
	double tempoInicioDelta = 0;
	public int quantEstavel = 0;
	public double tempoAnterior = 0;
	public double limiteInferior;
	public double limiteSuperior;
	public double estimadorMediaVazao = 0;
	public double estimadorVarianciaVazao = 0;
	int quantidadeDownloadsDelta = 0;
	int quantidadeDownloadsTotal = 0;
	boolean faseTransienteCalculada = false;

	public void calcFaseTransiente(double tempoDownload, double tempoAtual)
	{

		if (tempoInicioDelta == 0) tempoInicioDelta = tempoAtual;

		if (tempoAtual - tempoInicioDelta < tamDelta)
		{
			somatorioDelta += tempoDownload;
			quantidadeDownloadsDelta++;
		}
		else
		{
			mediaDelta = somatorioDelta / quantidadeDownloadsDelta;
			mediaTotal = (mediaTotal * quantidadeDownloadsTotal + mediaDelta * quantidadeDownloadsDelta) / (quantidadeDownloadsTotal + quantidadeDownloadsDelta);
			if (Math.abs(mediaDelta - mediaTotal) < 0.001 && quantidadeDownloadsTotal > 0)
			{
				System.out.println("Fim da fase transiente: " + tempoAtual);
				faseTransienteCalculada = true;
			}
			quantidadeDownloadsTotal += quantidadeDownloadsDelta;
			quantidadeDownloadsDelta = 0;
			tempoInicioDelta = 0;
			somatorioDelta = 0;
		}
	}

	public void calcEstimadorMediaVazao(ArrayList<Rodada> rodadas)
	{
		for (Rodada r : rodadas)
		{
			estimadorMediaVazao = estimadorMediaVazao + r.vazao;
		}
		estimadorMediaVazao = estimadorMediaVazao / rodadas.size();
	}

	public void calcEstimadorVarianciaVazao(ArrayList<Rodada> rodadas)
	{
		for (Rodada r : rodadas)
		{
			estimadorVarianciaVazao += (r.vazao - estimadorMediaVazao) * (r.vazao - estimadorMediaVazao);
		}
		estimadorVarianciaVazao /= (rodadas.size() - 1);
	}

	public void calcLimites(ArrayList<Rodada> rodadas)
	{
		calcVazao(rodadas);
		calcEstimadorMediaVazao(rodadas);
		calcEstimadorVarianciaVazao(rodadas);
		calcLimiteInferior(rodadas.size());
		calcLimiteSuperior(rodadas.size());
	}

	private void calcLimiteInferior(int numeroAmostras)
	{
		limiteInferior = estimadorMediaVazao - 1.96 * Math.sqrt(estimadorVarianciaVazao) / Math.sqrt(numeroAmostras);
	}

	private void calcLimiteSuperior(int numeroAmostras)
	{
		limiteSuperior = estimadorMediaVazao + 1.96 * Math.sqrt(estimadorVarianciaVazao) / Math.sqrt(numeroAmostras);
	}

	public void calcVazao(ArrayList<Rodada> rodadas)
	{
		double vazao;
		for (Rodada r : rodadas)
		{
			vazao = r.usuariosAtendidos / r.duracao;
			r.vazao = vazao;
		}
	}
}
